/*
 * Copyright 2005-2013 finalist.cn. All rights reserved.
 * Support: http://www.finalist.cn
 * License: http://www.finalist.cn/license
 */
package com.finalist.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.finalist.entity.Admin;
import com.finalist.entity.Member;
import com.finalist.entity.Product;

/**
 * Service - 会员
 * 
 * @author Finalist IT Group
 * @version 3.0
 */
public interface MemberService extends BaseService<Member, Long>
{

    /**
     * 判断用户名是否存在
     * 
     * @param username
     *            用户名(忽略大小写)
     * @return 用户名是否存在
     */
    boolean usernameExists(String username);

    /**
     * 判断手机号是否存在
     * 
     * @param phone
     *            手机号（必须是数字）
     * @return 手机号是否存在
     */
    boolean phoneExists(String phone);

    /**
     * 判断微信账号是否存在
     * 
     * @param openId
     *            微信账号id
     * @return 微信账号是否绑定
     */
    Member openIdExists(String openId);
    
    Member findByUnionId(String unionId);

    /**
     * 判断用户名是否禁用
     * 
     * @param username
     *            用户名(忽略大小写)
     * @return 用户名是否禁用
     */
    boolean usernameDisabled(String username);

    /**
     * 判断E-mail是否存在
     * 
     * @param email
     *            E-mail(忽略大小写)
     * @return E-mail是否存在
     */
    boolean emailExists(String email);

    /**
     * 判断E-mail是否唯一
     * 
     * @param previousEmail
     *            修改前E-mail(忽略大小写)
     * @param currentEmail
     *            当前E-mail(忽略大小写)
     * @return E-mail是否唯一
     */
    boolean emailUnique(String previousEmail, String currentEmail);

    /**
     * 保存会员
     * 
     * @param member
     *            会员
     * @param operator
     *            操作员
     */
    void save(Member member, Admin operator);

    /**
     * 更新会员
     * 
     * @param member
     *            会员
     * @param modifyPoint
     *            修改积分
     * @param modifyBalance
     *            修改余额
     * @param depositMemo
     *            修改余额备注
     * @param operator
     *            操作员
     */
    void update(Member member, Integer modifyPoint, BigDecimal modifyBalance, String depositMemo, Admin operator);

    /**
     * 根据用户名查找会员
     * 
     * @param username
     *            用户名(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    Member findByUsername(String username);

    /**
     * 根据E-mail查找会员
     * 
     * @param email
     *            E-mail(忽略大小写)
     * @return 会员，若不存在则返回null
     */
    List<Member> findListByEmail(String email);

    /**
     * 根据手机号查找会员
     * 
     * @param phone
     *            手机号
     * @return 会员，若不存在则返回null
     */
    Member findByPhone(String phone);

    /**
     * 查找会员消费信息
     * 
     * @param beginDate
     *            起始日期
     * @param endDate
     *            结束日期
     * @param count
     *            数量
     * @return 会员消费信息
     */
    List<Object[]> findPurchaseList(Date beginDate, Date endDate, Integer count);

    /**
     * 判断会员是否登录
     * 
     * @return 会员是否登录
     */
    boolean isAuthenticated();

    /**
     * 获取当前登录会员
     * 
     * @return 当前登录会员，若不存在则返回null
     */
    Member getCurrent();

    /**
     * 获取当前登录用户名
     * 
     * @return 当前登录用户名，若不存在则返回null
     */
    String getCurrentUsername();

    /**
     * 获取用户根据根据第三方用户的id
     * 
     * @return 返回用户，若不存在则返回null
     */
    Member getMemberByOpenId(String openId);

    public Member getMemberByNameAndMobile(String username, String mobile);

    Member findLoginMember(List<String> list);
    
    Member findByOpenId(String openId);
    
    /**
     * 用于获取购买了该产品的用户
     * @param product
     * @return
     */
    List<Member> findByProduct(Product product,int page);
}
